home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / e / amigae33a.lha / E_v3.3a / Src.lha / Src / Gfx / TextureMapping / texturemapper.e < prev    next >
Text File  |  1997-03-28  |  2KB  |  82 lines

  1. -> texturemapper
  2.  
  3. OPT MODULE
  4.  
  5. CONST FP=256,FPS=8,MAXROUND=2500
  6.  
  7. PROC scanline(x1,x2,tx1,tx2,ty1,ty2,thisy,cbuf,maxx,tmap)
  8.   DEF p,numpix,c:REG,stx:REG,sty:REG,cx:REG,cy,misx=0
  9.   IF (x1>=maxx) OR (x2<0) THEN RETURN
  10.   numpix:=x2-x1+1
  11.   IF x1<0 THEN (misx:=0-x1) BUT x1:=0
  12.   IF x2>=maxx THEN x2:=maxx-1
  13.   p:=thisy*maxx+x1+cbuf
  14.   ->IF numpix=0 THEN Raise("nump")
  15.   stx:=tx2-tx1*FP/numpix
  16.   sty:=ty2-ty1*FP/numpix
  17.   cx:=tx1*FP+(misx*stx)
  18.   cy:=ty1*FP+(misx*sty)
  19.   c:=x2-x1
  20.   MOVE.L p,A0
  21.   MOVE.L tmap,A1
  22.   ROR.W #8,cx
  23.   ROR.W #8,stx
  24.   SUB.B stx,cx
  25.   ADD.W stx,cx
  26.   MOVE.L cy,A2            -> A2 is copy of cy
  27. inner:
  28.   MOVE.L A2,D0            -> p[]++:=tmap[(cy/FP)*tmaxx+(cx/FP)]
  29.   ADD.L sty,A2            -> cy:=cy+sty
  30.   MOVE.B cx,D0            -> assumes FPS and tmaxx are 256
  31.   ADDX.W stx,cx            -> cx:=cx+stx
  32.   MOVE.B 0(A1,D0.L),(A0)+
  33.   DBRA c,inner
  34. ENDPROC
  35.  
  36. EXPORT PROC tmap(coords:PTR TO LONG,cbuf,maxx,maxy,tmap,tmaxx=256,tmaxy=256)
  37.   DEF rx[MAXROUND]:ARRAY OF LONG,ry[MAXROUND]:ARRAY OF LONG,trx[MAXROUND]:ARRAY OF LONG,
  38.       try[MAXROUND]:ARRAY OF LONG,curr=0,a,b,dist,q,
  39.       x1,y1,x2,y2,tmx,tmy,f,stx,sty,outm1,outm2,outmi1=10000,outmi2=-10000,sides=0
  40.   FOR a:=0 TO 6 STEP 2                -> for all 4 sides of the square
  41.     y1:=coords[a+1]
  42.     y2:=coords[a+3 AND 7]
  43.     IF dist:=Abs(y1-y2)
  44.       sides++
  45.       x1:=coords[a]
  46.       x2:=coords[a+2 AND 7]
  47.       IF Abs(x1-x2)+dist>2000 THEN RETURN    -> temp check
  48.       tmx:=IF a AND 2 THEN 0 ELSE tmaxx
  49.       tmy:=IF a AND 2 THEN tmaxy ELSE 0
  50.       f:=IF a>=4 THEN -1 ELSE 1
  51.       stx:=IF a+2 AND 4 THEN tmaxx ELSE 0
  52.       sty:=IF a>=4 THEN tmaxy ELSE 0
  53.       ->IF dist=0 THEN Raise("dist")
  54.       FOR q:=1 TO dist                -> for each y pixel of a side
  55.         rx[curr]:=x2-x1*q/dist+x1
  56.         ry[curr]:=y1+(q*Sign(y2-y1))
  57.         trx[curr]:=stx+(q*tmx/dist*f)
  58.         try[curr]:=sty+(q*tmy/dist*f)
  59.         curr++
  60.       ENDFOR
  61.       IF y2<outm1 THEN (outm1:=y2) BUT outmi1:=curr-1
  62.       IF y2>outm2 THEN (outm2:=y2) BUT outmi2:=curr-1
  63.     ENDIF
  64.   ENDFOR
  65.   IF sides<1 THEN RETURN
  66.   IF outmi1>outmi2
  67.     a:=outmi2
  68.     outmi2:=outmi1
  69.     outmi1:=a
  70.   ENDIF
  71.   FOR a:=outmi1 TO outmi2            -> for each scanline found
  72.     b:=IF a-outmi1<=outmi1 THEN outmi1-(a-outmi1) ELSE outmi2-(a-outmi2)
  73.     IF (ry[a]>=0) AND (ry[a]<maxy)
  74.       IF rx[b]>rx[a]
  75.         scanline(rx[a],rx[b],trx[a],trx[b],try[a],try[b],ry[a],cbuf,maxx,tmap)
  76.       ELSE
  77.         scanline(rx[b],rx[a],trx[b],trx[a],try[b],try[a],ry[a],cbuf,maxx,tmap)
  78.       ENDIF
  79.     ENDIF
  80.   ENDFOR
  81. ENDPROC
  82.